///////////////////////////////////////////////////////////////////////////////
/// @file string_manipulation.cpp
/// @author Benjamin J. Orr
/// @brief -- Custom string maniulation library because I'm tired of searching
///           for functions.
///////////////////////////////////////////////////////////////////////////////


/////////////////////////////
/// CUSTOM LIBS
/////////////////////////////
#include "string_manipulation.h"

/////////////////////////////
/// LIBS
/////////////////////////////
#include <string>
using std::string;
#include <sstream> //stringstream
using std::stringstream;
#include <algorithm> // transform()
#include <cctype> // tolower(), toupper()

///////////////////////////////////////////////////////////////////////////////
/// @fn string str_to_lower(string str)
/// @brief -- Converts str to lower case
/// @param string str -- the victim string
///////////////////////////////////////////////////////////////////////////////
string str_to_lower(string str)
{
  //use transform to iterate tolower across the string 
  transform(str.begin(), str.end(), str.begin(), (int(*)(int)) tolower);
  return str;
}

///////////////////////////////////////////////////////////////////////////////
/// @fn string str_to_upper(string str)
/// @brief -- Converts string to upper case
/// @param string str -- the victim string
///////////////////////////////////////////////////////////////////////////////
string str_to_upper(string str)
{
  //use transform to iterate toupper across the strong
  transform(str.begin(), str.end(), str.begin(), (int(*)(int)) toupper);
  return str;
}

///////////////////////////////////////////////////////////////////////////////
/// @fn string char_to_str(char chr)
/// @brief -- Converts chr to a string of length 1
/// @param char chr -- the victim char
///////////////////////////////////////////////////////////////////////////////
string char_to_str(char chr)
{
  //nothing fancy, just takes care of casting for me
  string str(1,chr);
  return str;
}

///////////////////////////////////////////////////////////////////////////////
/// @fn int str_to_int(string str)
/// @brief -- Converts str to an integer
/// @param string str -- The victim string
///////////////////////////////////////////////////////////////////////////////
int str_to_int(string str)
{
  //don't actually care about the pointer, this is a simple function
  return (int)strtol(str.c_str(),NULL,0);
}

///////////////////////////////////////////////////////////////////////////////
/// @fn int str_to_double(string str)
/// @brief -- Converts str to a double precision floating point number
/// @param string str -- the victim string
///////////////////////////////////////////////////////////////////////////////
double str_to_double(string str)
{
  return strtod(str.c_str(),NULL);
}

///////////////////////////////////////////////////////////////////////////////
/// @fn string charstar_to_string(char* chr)
/// @brief -- Converts chr to a string, great for argv[], I like inline casting
/// @param char* chr -- the victim char pointer
///////////////////////////////////////////////////////////////////////////////
string charstar_to_str(char* chr)
{
  string str = chr;
  return str;
}

///////////////////////////////////////////////////////////////////////////////
/// @fn string int_to_str(int num)
/// @brief -- Converts num to a string, very crude
/// @param int num -- the victim integer
///////////////////////////////////////////////////////////////////////////////
string int_to_str(int num)
{
  stringstream oss;
  string str;
  oss << num;
  str = oss.str();
  return str;
}
